#include "lua-engine.h"

using MemberFunc = int (LuaApi::*)(LuaPtr lptr);
using namespace std;

template <MemberFunc func> int dispatch(LuaPtr lptr) {
  LuaApi *ptr = *static_cast<LuaApi **>(lua_getextraspace(lptr));
  return ((*ptr).*func)(lptr);
}

void LuaEngine::reg() {
  // action
  lua_register(lptr_, "TakeTaxiRaw", &dispatch<&LuaApi::take_taxi>);
  lua_register(lptr_, "DestroyRaw", &dispatch<&LuaApi::destroy>);
  lua_register(lptr_, "SellRaw", &dispatch<&LuaApi::sell>);
  lua_register(lptr_, "EquipRaw", &dispatch<&LuaApi::equip>);
  lua_register(lptr_, "SendMailRaw", &dispatch<&LuaApi::send_mail>);
  lua_register(lptr_, "Loot", &dispatch<&LuaApi::loot>);
  lua_register(lptr_, "Select", &dispatch<&LuaApi::select>);
  lua_register(lptr_, "Macro", &dispatch<&LuaApi::macro>);
  lua_register(lptr_, "Click", &dispatch<&LuaApi::click>);
  lua_register(lptr_, "GoRaw", &dispatch<&LuaApi::go>);

  // ground
  lua_register(lptr_, "Grounds", &dispatch<&LuaApi::grounds>);

  // item
  lua_register(lptr_, "GetContainerItem",
               &dispatch<&LuaApi::get_container_item>);
  lua_register(lptr_, "GetContainerItemById",
               &dispatch<&LuaApi::get_container_item_by_id>);
  lua_register(lptr_, "GetContainerNumSlots",
               &dispatch<&LuaApi::get_container_num_slots>);
  lua_register(lptr_, "GetNumFreeSlots",
               &dispatch<&LuaApi::get_num_free_slots>);

  // unit
  lua_register(lptr_, "GetSpellCooldown",
               &dispatch<&LuaApi::get_spell_cooldown>);
  lua_register(lptr_, "GetSpells", &dispatch<&LuaApi::spells>);
  lua_register(lptr_, "GetUnitById", &dispatch<&LuaApi::get_unit_by_id>);
  lua_register(lptr_, "GetBuff", &dispatch<&LuaApi::get_buff>);
  lua_register(lptr_, "UnitGetBuff", &dispatch<&LuaApi::unit_get_buff>);
  lua_register(lptr_, "Units", &dispatch<&LuaApi::units>);
  lua_register(lptr_, "GetPlayer", &dispatch<&LuaApi::player>);

  // basic
  lua_register(lptr_, "GetTime", &dispatch<&LuaApi::get_time>);
  lua_register(lptr_, "GetGameTime", &dispatch<&LuaApi::get_game_time>);
  lua_register(lptr_, "KeyDown", &dispatch<&LuaApi::key_down>);
  lua_register(lptr_, "KeyUp", &dispatch<&LuaApi::key_up>);
  lua_register(lptr_, "Sleep", &dispatch<&LuaApi::sleep>);
  lua_register(lptr_, "Printf", &dispatch<&LuaApi::printf>);
  lua_register(lptr_, "Print", &dispatch<&LuaApi::print>);
}
